/-docs
/-editor
/-files
/-files-old
/-imports
/-layout
/-storage
/-tests
/-typings
TypeScriptService.ts
functions.ts
ko.ts
persistence.api.ts
persistence.ts
shell.ts
teapo.html
teapo.js
teapo.ts
​
 
1
module teapo {
2
​
3
  /**
4
   * Initialize storage loading the state from HTML DOM, WebSQL
5
   * and getting everything in a running state.
6
   * The API is asynchronous, provide handler.documentStorageCreated function
7
   * to receive the callback. 
8
   * @param handler All necessary parameters and overrides
9
   * for instantiating DocumentStorage.
10
   */
11
  export function openStorage(handler: DocumentStorageHandler, forceLoadFromDom = false): void {
12
​
13
    var storage = new RuntimeDocumentStorage(handler, forceLoadFromDom);
14
  }
15
​
16
​
17
  interface ExecuteSqlDelegate {
18
    (sqlStatement: string,
19
      arguments: any[],
20
      callback: (transaction: SQLTransaction, result: SQLResultSet) => void,
21
      errorCallback: (transaction: SQLTransaction, resultSet: SQLError) => void): void;
22
  }
23
​
24
  class RuntimeDocumentStorage implements DocumentStorage {
25
    document: typeof document = null;
26
​
27
    _metadataElement: HTMLScriptElement = null;
28
​
29
    private _metadataProperties: any = null;
30
    private _docByPath: { [name: string]: RuntimeDocumentState; } = {};
31
​
32
    private _executeSql: ExecuteSqlDelegate = null;
33
    private _insertMetadataSql = '';
34
    private _updateMetadataSql = '';
35
    
36
    _savingCache = new FileSavingCache();
37
​
38
    savingFiles = this._savingCache.savingFiles;
39
    
40
    constructor(
41
      public handler: DocumentStorageHandler,
42
      forceLoadFromDom: boolean) {
43
​
44
      this.document = this.handler.document ? this.handler.document : document;
45
​
46
      var pathElements = this._scanDomScripts();
47
      if (!this._metadataElement) {
48
        this._metadataElement = appendScriptElement(this.document);
49
        this._metadataElement.id = 'storageMetadata';
50
      }
51
​
52
      var openDatabase = this.handler.openDatabase || getOpenDatabase();
53
      if (typeof openDatabase === 'function') {
54
        var dbName = this.handler.uniqueKey ? this.handler.uniqueKey : getUniqueKey();
55
        var db = openDatabase(dbName, 1, null, 1024 * 1024 * 5);
56
​
57
        this._executeSql = (
58
          sqlStatement: string,
59
          args: any[],
60
          callback: (transaction: SQLTransaction, result: SQLResultSet) => void,
61
          errorCallback: (transaction: SQLTransaction, error: SQLError) => void) => {
62
​
63
          var errorCallbackSafe = (t: SQLTransaction, e: SQLError) => {
64
            alert(e + ' ' + e.message + '\n' + sqlStatement + '\n' + args);
65
            errorCallback(t, e);
66
          };
67
            
68
          db.transaction((t) => t.executeSql(sqlStatement, args, callback, errorCallbackSafe));
69
        };
70
        this._insertMetadataSql = 'INSERT INTO "*metadata" (name, value) VALUES(?,?)';
71
        this._updateMetadataSql = 'UPDATE "*metadata" SET value=? WHERE name=?';
72
​
73
        this._metadataProperties = {};
74
        this._loadTableListFromWebsql((tableList) => {
75
          var metadataTableExists = false;
76
          for (var i = 0; i < tableList.length; i++) {
77
            if (tableList[i] === '*metadata') {
78
              metadataTableExists = true;
/persistence.ts
12:0